// 给定一个包含红色、白色和蓝色，一共 n 个元素的数组，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。

// 此题中，我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

// 注意:
// 不能使用代码库中的排序函数来解决这道题。

// 示例:

// 输入: [2,0,2,1,1,0]
// 输出: [0,0,1,1,2,2]
// 进阶：

// 一个直观的解决方案是使用计数排序的两趟扫描算法。
// 首先，迭代计算出0、1 和 2 元素的个数，然后按照0、1、2的排序，重写当前数组。
// 你能想出一个仅使用常数空间的一趟扫描算法吗？

// 元素 种类 固定的 排序
// 思路1 计数排序

// 记数排序
// function sortColors(arr) {
//   let colors = [0, 0, 0]
//   for (let i = 0; i < arr.length; i++) {
//     colors[arr[i]]++
//   }
//   arr.length = 0
//   for (let i = 0; i < colors.length; i++) {
//     for (let j = 0; j < colors[i]; j++) {
//       arr.push(i)
//     }
//   }
// }

// sortColors([2, 0, 2, 1, 1, 0, 0])

// 三路快排

function swap(arr, i, j) {
  let temp = arr[i]
  arr[i] = arr[j]
  arr[j] = temp
}

function sortColors(nums) {
  let l = -1,
    r = nums.length // [0,l]存着  0  [r,nums.length] 存着2
  for (let i = 0; i < r; ) {
    if (nums[i] === 2) {
      r--
      swap(nums, i, r)
    } else if (nums[i] === 0) {
      l++
      swap(nums, i, l)
      i++
    } else {
      i++
    }
  }
  console.log(nums, "log")
}
sortColors([2, 0, 2, 1, 1, 0, 0])
